package com.cardcaptorsakura.model.dto;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;

/**
 * 图像生成请求DTO
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ImageGenerationRequest {

    /**
     * 用户ID
     */
    @NotBlank(message = "用户ID不能为空")
    private String userId;

    /**
     * 图像生成提示词
     */
    @NotBlank(message = "图像提示词不能为空")
    private String prompt;

    /**
     * 图像宽度
     */
    @Min(value = 256, message = "图像宽度不能小于256")
    @Max(value = 2048, message = "图像宽度不能大于2048")
    @Builder.Default
    private Integer width = 512;

    /**
     * 图像高度
     */
    @Min(value = 256, message = "图像高度不能小于256")
    @Max(value = 2048, message = "图像高度不能大于2048")
    @Builder.Default
    private Integer height = 512;

    /**
     * 图像风格
     */
    private String style;

    /**
     * 图像质量
     */
    @Builder.Default
    private String quality = "standard";

    /**
     * 生成数量
     */
    @Min(value = 1, message = "生成数量不能小于1")
    @Max(value = 4, message = "生成数量不能大于4")
    @Builder.Default
    private Integer count = 1;

    /**
     * 是否使用高清模式
     */
    @Builder.Default
    private Boolean hd = false;

    /**
     * 种子值（用于复现）
     */
    private Long seed;

    /**
     * 负面提示词（不希望出现的内容）
     */
    private String negativePrompt;

    /**
     * 引导强度（0.0-1.0）
     */
    @Min(value = 0, message = "引导强度不能小于0")
    @Max(value = 1, message = "引导强度不能大于1")
    @Builder.Default
    private Double guidanceScale = 0.7;

    /**
     * 推理步数
     */
    @Min(value = 1, message = "推理步数不能小于1")
    @Max(value = 100, message = "推理步数不能大于100")
    @Builder.Default
    private Integer steps = 20;

    /**
     * 采样器类型
     */
    @Builder.Default
    private String sampler = "DPM++ 2M Karras";

    /**
     * 是否保存到用户历史
     */
    @Builder.Default
    private Boolean saveToHistory = true;

    /**
     * 请求ID（用于追踪）
     */
    private String requestId;

    /**
     * 额外参数
     */
    private java.util.Map<String, Object> extraParams;
}